객체 지향 (다형성)
이 노트는 C++ 객체지향의 다형성 개념과 이를 구현하는 오버로딩·오버라이딩·순수 가상함수를 정리한다. 오버로딩은 같은 이름의 함수를 인자 형태로 구분해 재정의하는 것이고, 오버라이딩은 virtual과 override 키워드를 통해 동일한 인터페이스로 객체마다 다르게 동작하도록 만드는 것이며, 순수 가상함수(= 0)를 하나라도 가진 클래스는 추상 클래스가 되어 인스턴스를 생성할 수 없다는 점이 핵심이다.
다형성
다형성
- 같은 메서드(멤버함수)가 다른 객체에서는 다르게 동작하는 것을 의미
- 동일한 인터페이스를 통해 서로 다른 구현 가능
- 코드의 유연성 및 확장성
다형성의 종류
- 다형성
- 같은 인터페이스를 통해, 여러가지 다른 형태의 객체를 다룰 수 있게 해주는 특성
- 오버로딩
- 함수이름은 동일하되 인자를 다르게하여 재정의
- 일반적으로 일반함수 생성에서도 많이 사용되는 기법
- 인자형태에 따라 다르게 함수 호출
오버로딩
class Player
{
void Test()
{
cout << “test” << endl;
}
};
class Archer : public Player
{
void Test(int hp) // Test() 오버로딩
{
_hp = hp;
cout << “test2” << endl;
}
};
- 오버라이딩
- 똑같은 함수이름과 동일한 인자형태를 가진 메서드가, 객체에 따라 다르게 동작
- 가상함수 사용 (virtual)
- c++11에서 도입된 override키워드를 통해, 가상 함수의 메서드가 다를시 에러를 내뱉음
- (즉, override는 virtual함수의 재정의 함수라는 것을 컴파일러에게 알리기 위해 사용)
- 연산자 오버로딩
- 다음 블로그 주제로…
- 순수 가상함수
virtual [반환타입] 가상함수이름 = 0;
-
순수 가상함수를 사용할 경우, 해당 클래스는 추상화클래스가 되어 인스턴스 생성이 불가능하다
#include <iostream>
using namespace std;
class Player
{
public:
Player()
{
}
virtual void VTest() = 0; // 순수 가상함수
virtual void VSpeek()
{
cout << "Player" << endl;
}
};
class Archer : public Player
{
public:
Archer()
{
_hp = 0;
_attack = 0;
}
void VTest() override // 필수
{
cout << "순수 가상함수 archer! " << endl;
}
void VSpeek() override // 재정의 키워드 추가 "override"
{
cout << "Archer" << endl;
}
public:
int _hp;
int _attack;
};
void VirtualTest(Player* player)
{
//player->VSpeek()를 호출했지만, Archer->VSpeek()함수가 호출됨
// player라는 같은 인터페이스 이용
player->VSpeek();
}
int main()
{
//Player p1; // 순수 가상함수가 있다는 것은 추상화 클래스 이므로, 인스턴스 사용 불가
Archer ar; // 순수 가상함수의 재정의는 필수값
VirtualTest(&ar);
}